package day07.concurrent04;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 代理设计模式
 */
interface Star{
    void eat();
    void sign();
}

interface Singer{
    void sing();
}

class FBB implements Star,Singer{

    @Override
    public void eat() {
        System.out.println("fbb吃饭..");
    }

    @Override
    public void sign() {
        System.out.println("fbb签名..");
    }

    @Override
    public void sing() {
        System.out.println("fbb唱歌..");
    }

    public void shufa(){
        System.out.println("fbb书法..");
    }
}

//代理设计模式
public class Demo10 {
    public static void main(String[] args) {
        FBB fbb = new FBB();

        //动态代理 - 第三方动态代理 - CGLIB动态代理 - 基于继承实现

        //动态代理 - Java的动态代理 - 基于接口实现，对于非接口方法无法代理
        Star zqd = (Star) Proxy.newProxyInstance(
                FBB.class.getClassLoader(),//类加载器
                FBB.class.getInterfaces(),//要实现的接口们
                new InvocationHandler() { //处理器
                    /**
                     * @param proxy 代理者 - zqd
                     * @param method 代表当前正在调用的方法
                     * @param args 代表当前正在调用的方法的参数列表
                     */
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("ZQD:你谁啊？？？？");
                        Object retObj = method.invoke(fbb, args);
                        System.out.println("ZQD:记录一下...");
                        return retObj;
                    }
                }
        );

        zqd.eat();
        zqd.sign();
        ((Singer)zqd).sing();

//        //静态代理
//        class ZL implements Star{
//            @Override
//            public void eat() {
//                System.out.println("ZL:你谁啊？？？？");
//                fbb.eat();
//                System.out.println("ZL:记录一下...");
//            }
//
//            @Override
//            public void sign() {
//                System.out.println("ZL:你谁啊？？？？");
//                fbb.sign();
//                System.out.println("ZL:记录一下...");
//            }
//        }
//
//        ZL zl = new ZL();
//        zl.eat();
//        zl.sign();
    }
}
